# -*- coding: UTF-8 -*- 

from django.shortcuts import render,redirect,get_object_or_404
from .models import *
from .forms import *
from django.db import IntegrityError  
from django.http import JsonResponse
from django.core.paginator import Paginator
import time

# Create your views here.

def lists(request,table):
    if table == 'device':  
        data = device.objects.all()  
        list_template = 'device_list.html'  
        sub_title = '主机信息'
    if table == 'service':  
        data = service.objects.all()  
        list_template = 'service_list.html'
        sub_title = '服务信息'
    if request.method == 'GET':  
        #建立一个空的参数的字典  
        kwargs = {}  
        #建立一个空的查询语句  
        query = ''  
        #提交过来的GET值是一个迭代的键值对  
        for key, value in request.GET.items():  
            #刨去其中的token和page选项  
            if key != 'csrfmiddlewaretoken' and key != 'page':  
                #由于线路和设备的外键均与node表格有关，当查询线路中的用户名称或设备信息中的使用部门时，可以直接通过以下方式跨表进行查找  
                if key == 'device':  
                    kwargs['device__device_hostname__contains'] = value  
                    #该query用于页面分页跳转时，能附带现有的搜索条件  
                    query += '&' + key + '=' + value  
                #其余的选项均通过key来辨别  
                else:  
                    kwargs[key + '__contains'] = value  
                    #该query用于页面分页跳转时，能附带现有的搜索条件  
                    query += '&' + key + '=' + value  
        #通过元始数据进行过滤，过滤条件为健对值的字典  
        data = data.filter(**kwargs)  
    #如果没有从GET提交中获取信息，那么data则为元始数据  
    else:  
        data = data  
        
    data_list,page_range,count,page_nums = pagination(request,data)
    context = {'data':data_list,'table':table,'query':query,'page_range':page_range,'count':count,'page_nums':page_nums,'sub_title':sub_title,}

    return render(request,list_template,context)

def add(request,table):
    if table == 'device':
        form = deviceForm(request.POST or None)
        sub_title = '添加主机'
    if table == 'service':
        form = serviceForm(request.POST or None)
        sub_title = '添加服务'
    if form.is_valid():
        instance = form.save(commit=False)
        if table == 'device':
            instance.device_contact = request.user
        if table == 'service':
            instance.service_contact = request.user

        instance.save()
        return redirect('lists',table=table)
    context = {'form':form,'table':table,'sub_title':sub_title,}

    return render(request,'res_add.html',context)

def index(request):
    context = {}
    return render(request,'index.html',context)

def edit(request,table,pk):
    if table == 'device':
        table_ins = get_object_or_404(device, pk=pk)
        form = deviceForm(request.POST or None,instance=table_ins)
        sub_title = '修改主机信息'
    if table == 'service':
        table_ins = get_object_or_404(service,pk=pk)
        form = serviceForm(request.POST or None,instance=table_ins)
        sub_title = '修改服务信息'
    if form.is_valid():
        instance = form.save(commit=False)
        if table == 'device':
            instance.device_contact = str(request.user)
        if table == 'service':
            instance.service_contact = str(request.user)
        instance.save()
        return redirect('lists',table=table)
    
    context = {'table':table,'form':form,'sub_title':sub_title,}

    return render(request,'res_add.html',context)

def delete(request, table ,pk):  
    #选择相应的表格  
    if table == 'device':  
        #通过id值获取相应表格的实例，有值则返回，无值则抛出异常  
        table_ins = get_object_or_404(device, pk=pk)  
  
    if table == 'service':  
        table_ins = get_object_or_404(service, pk=pk)  
  
    #接收通过AJAX提交过来的POST  
    if request.method == 'POST':  
        #删除该条目  
        try:  
            table_ins.delete()  
            #删除成功,则data信息为success  
            data = 'success'  
        except IntegrityError:  
            #如因外键问题，或其他问题，删除失败，则报error  
            data = 'error'  
        #将最后的data值传递至JS页面，进行后续处理  
        return JsonResponse(data)

def pagination(request, queryset, display_amount=10, after_range_num = 5,before_range_num = 4):  
    #按参数分页  
    try:  
        #从提交来的页面获得page的值  
        page = int(request.GET.get("page", 1))  
        #如果page值小于1，那么默认为第一页  
        if page < 1:  
            page = 1  
    #若报异常，则page为第一页  
    except ValueError:  
            page = 1  
    #引用Paginator类  
    paginator = Paginator(queryset, display_amount)  
    #总计的数据条目  
    count = paginator.count  
    #合计页数  
    num_pages = paginator.num_pages  
  
    try:  
        #尝试获得分页列表  
        objects = paginator.page(page)  
    #如果页数不存在  
    except EmptyPage:  
        #获得最后一页  
        objects = paginator.page(paginator.num_pages)  
    #如果不是一个整数  
    except PageNotAnInteger:  
        #获得第一页  
        objects = paginator.page(1)  
    #根据参数配置导航显示范围  
    temp_range = paginator.page_range  
  
    #如果页面很小  
    if (page - before_range_num) <= 0:  
        #如果总页面比after_range_num大，那么显示到after_range_num  
        if temp_range[-1] > after_range_num:  
            page_range = range(1, after_range_num+1)  
        #否则显示当前页  
        else:  
            page_range = range(1, temp_range[-1]+1)  
    #如果页面比较大  
    elif (page + after_range_num) > temp_range[-1]:  
        #显示到最大页  
        page_range = range(page-before_range_num,temp_range[-1]+1)  
    #否则在before_range_num和after_range_num之间显示  
    else:  
        page_range = range(page-before_range_num+1, page+after_range_num)  
    #返回分页相关参数  
    return objects, page_range, count, num_pages

def task_list(request):  
    #如果通过GET来获取了相应参数，那么进行查询  
    if request.method == 'GET':  
        #建立过滤条件的键值对  
        kwargs = {}  
        #默认显示处理中的任务  
        kwargs['task_status'] = '处理中'  
        #用于分页显示的query  
        query = ''  
        for key, value in request.GET.items():  
            #除去token及page的参数  
            if key != 'csrfmiddlewaretoken' and key != 'page':  
                #如果查询的是与处理过程相关的，那么需要通过外键跳转至process表格  
                if key == 'process_content':  
                    if value !='':  
                        kwargs['process__process_content__contains'] = value  
                elif key == 'process_signer':  
                    if value !='':  
                        kwargs['process__process_signer__contains'] = value  
                #定义任务的开始与结束时间  
                elif key == 'task_start':  
                    if value != '':  
                        kwargs['task_signtime__gte'] = value  
                elif key == 'task_end':  
                    if value != '':  
                        kwargs['task_signtime__lte'] = value  
                #定义任务的状态  
                elif key == 'task_status':  
                    if value == U'处理中':  
                        kwargs['task_status'] = '处理中'  
                    if value == U'已结单':  
                        kwargs['task_status'] = '已结单'  
                    #如果选择了所有状态，即对任务状态不进行过滤，那么就删除task_status这个键值对  
                    if value == U'全部':  
                        del kwargs['task_status']  
                #其余的则根据提交过来的键值对进行过滤  
                else:  
                    kwargs[key + '__contains'] = value  
                #建立用于分页的query  
                query += '&' + key + '=' + value  
        #按照登记时间排序  
        data = Task.objects.filter(**kwargs).order_by('task_signtime')  
  
  
    #如果没有GET提交过来的搜索条件，那么默认按照登记时间排序，并只显示处理中的任务  
    else:  
        data = Task.objects.filter(task_status='处理中').order_by('task_signtime') 
    data_list,page_range,count,page_nums = pagination(request,data)
    context = {'data':data_list,'query':query,'page_range':page_range,'count':count,'page_nums':page_nums,'sub_title':'任务信息',}
    return render(request,'task_list.html',context)

def task_add(request):  
    #从TaskForm获取相关信息  
    form = TaskForm(request.POST or None)  
    if form.is_valid():  
        #建立一个task实例  
        task_ins = Task()  
        #通过时间来建立一个任务流水  
        task_ins.task_code = str(int(time.time()))  
        #获取task的相关信息  
        task_ins.task_title = form.cleaned_data.get('task_title')  
        task_ins.task_category = form.cleaned_data.get('task_category')  
        task_ins.task_contacts = form.cleaned_data.get('task_contacts')  
        #task建立后默认变成处理中的状态  
        task_ins.task_status = '处理中'  
        #通过登录用户来辨别任务登记人  
        task_ins.task_signer = request.user  
        #保存task实例  
        task_ins.save()  
        #通过当前task_id获取task对象，并将其赋给member_task  
        member_task = Task.objects.get(id = task_ins.id)  
        #获取members集合  
        members = form.cleaned_data.get('task_member')  
        #获取members集合中的member,并将其添加到member_task中,增添相应实施人员  
        for member in members:  
            member_task.task_member.add(member)  
  
        #通过task_id获取task对象  
        process_task = Task.objects.get(id = task_ins.id)  
        #建立一个process的实施步骤实例  
        process_ins = Process()  
        #将process实例与task绑定  
        process_ins.task = process_task  
        #获取process相关信息  
        process_ins.process_content = form.cleaned_data.get('process_content')  
        process_ins.process_signer = request.user  
        process_ins.save()  
        return redirect('task_list')  
  
    context = {  
        'form': form,  
        'sub_title': '新建任务',  
    }  
    return render(request, 'task_add.html',  context)  
  
def task_edit(request,pk):  
    pass  
def task_delete(request,pk):  
    pass 
